﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESpace;
using System.IO;

namespace Organizer
{

    public partial class FormNote : Form
    {
        DIR actDir;
        bool bEdit = false;
        bool bOk = false;

        // возвращаемые данные
        public string ret_Name;
        public string ret_Text;

        public FormNote()
        {
            InitializeComponent();
        }

        public bool ShowDialog(DIR actDir, Element editElForCopy)
        {
            bOk = false;
            this.actDir = actDir;
            bEdit = editElForCopy!=null;

            txbName.Text = "";
            txbText.Text = "";
            if (bEdit)
            {
                txbName.Text = editElForCopy.Name;
                txbText.Text = ((Note)editElForCopy).Text;
            }
            else
            {
                // название по умолчанию
                txbName.Text = actDir.GetUnicName("Новая заметка", "note");
            }

            txbName.Enabled = !bEdit;

            ShowDialog();
            return bOk;
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            // проверка имени
            string nm = txbName.Text.Trim();
            if (!bEdit)
            {
                string err = Gl.CheckName(actDir, null, nm);
                if (err!="")
                {
                    Gl.ErrMess(err);
                    txbName.Focus();
                    txbName.SelectAll();
                    return;
                }
            }

            ret_Name = nm;
            ret_Text = txbText.Text;
            

            bOk = true;
            Close();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            bOk = false;
            Close();
        }

    }

    public class NoteUnit : VisibleUnit
    {
        public override string Ext { get { return "note"; } }
        public override string MenuName { get { return "заметку"; } }

        public NoteUnit(API_Funtions ExtFunc) : base(ExtFunc) { ; }

        public override Element LoadElement(EStream st, DBItem Parent) { return new Note(st, Parent); }

        public override Element CreateElementBySourceDate(string Name, DBItem Parent, string SourceData)
        {
            Note ret = new Note(Name, Parent, "", NetStatus.Local);
            ret.SourceData = SourceData;
            return ret;
        }

        protected override List<Bitmap> GetIcoList()
        {
            List<Bitmap> bmpL = new List<Bitmap>();
            bmpL.Add(Properties.Resources.note);
            bmpL.Add(Properties.Resources.note_L);
            bmpL.Add(Properties.Resources.note_ok);
            bmpL.Add(Properties.Resources.note_U);
            return bmpL;
        }

        public override int GetNumIco(Element el)
        {
            switch (el.NetStat)
            {
                case NetStatus.Local: return icoIndL[0];
                case NetStatus.NotActual: return icoIndL[1];
                case NetStatus.Write: return icoIndL[3];
                case NetStatus.Actual: return (Gl.IsActualFlag ? icoIndL[2] : icoIndL[1]);
            }
            return -1;
        }
        
        DIR editParent = null;
        Note editEl = null;
        public override Element CreateNew(DIR Parent, NetStatus NetStat)
        {
            Note ret = null;
            editParent = Parent;
            editEl = null;
            FormNote frmEdit = new FormNote();
            if (frmEdit.ShowDialog(Parent, null))
            {
                ret = new Note(frmEdit.ret_Name, Parent, frmEdit.ret_Text, NetStat);
                ret.NetStat = NetStat;
            }
            editParent = null;
            return ret;
        }

        public override bool Edit(Element EditEl)
        {
            EditEl.IsEdit = true;
            bool ret = false;
            editParent = (DIR)EditEl.Parent;
            editEl = (Note)EditEl;
            FormNote frmEdit = new FormNote();
            if (frmEdit.ShowDialog(editParent, EditEl))
            {
                editEl.Text = frmEdit.ret_Text;
                editEl.NetStat = EditEl.NetStat == NetStatus.Local ? NetStatus.Local : NetStatus.NotActual;
                ret = true;
            }
            editParent = null;
            editEl = null;
            EditEl.IsEdit = false;
            return ret;
        }

        public override void TimerTick(DateTime tmrDt, DIR DB)
        {
            ;
        }

        /// <summary> событие изменения режима гости </summary>
        public override void GuestModeChange(bool bGuest) { ;}

        /// <summary> событие возникает после загрузки базы. Сам юнит создается до загрузки базы
        /// событие используется для выполнения начальных дейтсвий с уже загруженой базой </summary>
        public override void EndCreate() { ;}
    }

    public class Note : Element
    {
        int ActVer = 0;

        public override string Ext { get { return "note"; } }

        public override string SourceData
        {
            get
            {
                string ret = "";
                using (MemoryStream ms = new MemoryStream())
                {
                    using (BinaryWriter bw = new BinaryWriter(ms))
                    {
                        bw.Write(ActVer);// задел на версионность
                        bw.Write(Text);
                        ret = Convert.ToBase64String(ms.ToArray());
                    }
                }
                return ret;
            }
            set
            {
                using (MemoryStream ms = new MemoryStream(Convert.FromBase64String(value)))
                {
                    using (BinaryReader br = new BinaryReader(ms))
                    {
                        br.ReadInt32(); // задел на версионность
                        Text = br.ReadString();
                    }
                }

            }

        }

        public string Text = "";

        public Note(string Name, DBItem Parent, string Text, NetStatus NetStat) : base(Name, false, Parent, NetStat) { this.Text = Text; }

        public Note(EStream st, DBItem Parent)
            : base(st, Parent)
        {
            int LoadVer = st.LoadInt();
            switch (LoadVer)
            {
                case 0: Load0(st); break;
                default: throw new Exception("Невозможно загрузить элемент, так как версия не поддерживается");
            }
        }

        public override void Dispose() { ; }

        void Load0(EStream st)
        {
            Text = st.LoadStr();
        }

        public override void Save(EStream st)
        {
            base.Save(st);
            st.SaveInt(ActVer);

            st.SaveStr(Text);
        }
        
        public override string GetComment()
        {
            return "заметка";
        }

        public override void TimerTick(DateTime tmrDt, DIR DB) { ;}
    }

}
